home *** CD-ROM | disk | FTP | other *** search
/ Shareware Super Platinum 8 / Shareware Super Platinum 8.iso / mac / DATABASE / OBJ1_2.ZIP;1 / C_TASK.PRG < prev    next >
Encoding:
Text File  |  1993-01-21  |  15.3 KB  |  462 lines

  1. //*****************************************************************************
  2. // C_Task.prg
  3. // Task class for OBJECT v2.03
  4. // Copyright (c) 1991, JHK, JHK-Software, Piestany
  5. // Compile with: /N/M/W/A
  6. //-----------------------------------------------------------------------------
  7.  
  8. #include "InKey.ch"
  9. #include "Object.ch"
  10.  
  11. static TList:={}    //task list
  12. static LastTask:={} //last active task
  13. static Cmd:=0       //command for execute with SetKey  (InKey code)
  14.  
  15. create class Task from Window                //Usage sequence: Init, Process,... Done
  16.   export:                           //YOU OVERWRITE: (Init()),VPaint(),VProcess(),(Done())
  17.   var IsDead         // false       //true for dead task, need for correctly return from child(s) VProcess()
  18.   var DoneBlock      // {||true}    //use for various setting in doneing any object.
  19.   method New=TaskNew              //o:New()
  20.   method Init=TaskInit            //o:Init(Name,R,C,Rs,Cs,Clr,Shadow)
  21.   method GoodInit=TaskGoodInit    //o:GoodInit(Name,R,C,Rs,Cs,CurSize,Clr,Shadow)
  22.   method Top=TaskTop              //o:Top(lRepaint) //make this task as last active task
  23.   method VProcess=TaskVProcess    //o:VProcess()    //virtual process, use (overwrite) in child classes for execute application.
  24.   method Process=TaskProcess      //o:Process()     //execute Init() and Done().
  25.   method Done=TaskDone            //o:Done(lRePaint)  //true for RePaint windows (tasks)
  26.   endclass
  27.  
  28.  
  29. //*****************************************************************************
  30. // Task:New() --> self
  31. // initialize new object
  32. //
  33. constructor TaskNew()
  34.   ::IsDead:= false
  35.   ::DoneBlock:= {||true}
  36.   return(self)
  37.  
  38.  
  39. //-----------------------------------------------------------------------------
  40. // GetTList() --> TList
  41. // return task list
  42. //
  43. function GetTList()
  44.   return(TList)
  45.  
  46.  
  47. //-----------------------------------------------------------------------------
  48. // SetLastTask([NewTask]) --> Task object
  49. // get/set last active task
  50. //
  51. function SetLastTask(NewTask)  //nil value allowed!
  52.   local lt:=LastTask
  53.   if PCount()==1; LastTask:=NewTask; endif
  54.   return(lt)
  55.  
  56.  
  57. //-----------------------------------------------------------------------------
  58. // RestartTask() --> true/false
  59. // return last active task from TList, need for menu class
  60. //
  61. function RestartTask()
  62.   if Empty(TList); return(false); endif
  63.   if !Empty(LastTask); return(LastTask:Process()); endif
  64.   return(ATail(GetWList()):Process())
  65.  
  66.  
  67. //*****************************************************************************
  68. // Task:Init(Name,R,C,Rs,Cs,Clr,Shadow) --> true
  69. // initialize the task.
  70. //
  71. method function TaskInit(Name,R,C,Rs,Cs,Clr,Shadow)
  72.   ::super(Window):Init(Name,R,C,Rs,Cs,Clr,Shadow)
  73.   return(EndInit(self))
  74.  
  75.  
  76. //*****************************************************************************
  77. // Task:GoodInit(Name,R,C,Rs,Cs,CurSize,Clr,Shadow) --> true
  78. // initialize the task.
  79. //
  80. method function TaskGoodInit(Name,R,C,Rs,Cs,CurSize,Clr,Shadow)
  81.   ::super(Window):GoodInit(Name,R,C,Rs,Cs,CurSize,Clr,Shadow)
  82.   return(EndInit(self))
  83.  
  84.  
  85. //*****************************************************************************
  86. // Task::EndInit() --> true
  87. // initialize Task extension instvars
  88. //
  89. static function EndInit(Task)
  90.   if !Task:UpFlag                //for keeping children do not SetKeys...
  91.     if Task:ID<=9
  92.       SetKey(K_ALT_1+Task:ID-1,{||(Cmd:=LastKey()),StuffKey(nSwapTask)})
  93.     endif
  94.     if Empty(TList)
  95.       SetKey(K_ALT_0, {||(Cmd:=K_ALT_0), StuffKey(nSwapTask)})  //task-list
  96.       SetKey(K_F5,    {||(Cmd:=K_F5),    StuffKey(nSwapTask)})  //zoom-in
  97.       SetKey(K_SH_F5, {||(Cmd:=K_SH_F5), StuffKey(nSwapTask)})  //zoom-out
  98.       SetKey(K_F6,    {||(Cmd:=K_F6),    StuffKey(nSwapTask)})  //switch-forward
  99.       SetKey(K_SH_F6, {||(Cmd:=K_SH_F6), StuffKey(nSwapTask)})  //switch-backward
  100.       SetKey(K_F7,    {||(Cmd:=K_F7),    StuffKey(nSwapTask)})  //tile
  101.       SetKey(K_SH_F7, {||(Cmd:=K_SH_F7), StuffKey(nSwapTask)})  //cascade
  102.       SetKey(K_F8,    {||(Cmd:=K_F8),    StuffKey(nSwapTask)})  //drag
  103.       SetKey(K_SH_F10,{||(Cmd:=K_SH_F10),StuffKey(nSwapTask)})  //local-window-menu
  104.     endif
  105.     AAdd(TList,Task)
  106.   endif
  107.   return(true)
  108.  
  109.  
  110. //*****************************************************************************
  111. // Task:Top(lRepaint) --> nil
  112. // make this task as last active task.
  113. //
  114. method function TaskTop(lRepaint)
  115.   LastTask:=self
  116.   return(::super(Window):Top(lRepaint))
  117.  
  118.  
  119. //*****************************************************************************
  120. // Task:VProcess() --> Task
  121. // virtual process, I recomend that You overwrite this method, for execute app.code.
  122. //
  123. method function TaskVProcess()
  124.   PauseKey(0)
  125.   return(self)
  126.  
  127.  
  128. //*****************************************************************************
  129. // Task:Process() --> true
  130. // this is main application loop.
  131. //
  132. method function TaskProcess()
  133.   local nt, ct  //NewTask, CurrentTask
  134.   ct:=self
  135.   if ct:UpFlag
  136.     LastTask:=ct
  137.     if !(ValType(nt:=ct:VProcess())$"LU"); ct:=nt; endif  //change task allowed!  //nt can be OBJECT or TRUE or NIL
  138.     ct:SaveIn()
  139.   else
  140.     if Empty(LastTask)
  141.       ct:Top(true)               //RePaint!
  142.     elseif ct:ID<>LastTask:ID
  143.       ct:Top(false)              //Paint!
  144.     endif
  145.     repeat
  146.       if ct:IsMin
  147.         SaveDOut(ResTxt(145))
  148.         SaveHelpIdx({1})
  149.         PauseKey(0)
  150.         RestHelpIdx()
  151.         RestDOut()
  152.       else
  153.         LastTask:=ct
  154.         if !(ValType(nt:=ct:VProcess())$"LU"); ct:=nt; endif  //change task allowed!  //nt can be OBJECT or TRUE or NIL
  155.         ct:SaveIn()
  156.       endif
  157.       if LastKey()==K_CTRL_RET; SetLastKey(K_ESC); endif  //done==exit
  158.       if LastKey()==K_ESC;      Cmd:=K_ESC;        endif  //task::done()
  159.       do case
  160.         case K_ALT_1<=Cmd and Cmd<=K_ALT_9; ct:=Top(ct)  //task-top (see ID)
  161.         case Cmd==K_ALT_0;   ct:=List(ct)                //task-list
  162.         case Cmd==K_ESC;     ct:=Done(ct)                //task-done virtual!
  163.         case Cmd==K_F5;      ZoomIn(ct)                  //zoom-out
  164.         case Cmd==K_SH_F5;   ZoomOut(ct)                 //zoom-out
  165.         case Cmd==K_F6;      ct:=Switch(ct,true)         //switch-forward
  166.         case Cmd==K_SH_F6;   ct:=Switch(ct,false)        //switch-backward
  167.         case Cmd==K_F7;      Tile(ct)                    //tile
  168.         case Cmd==K_SH_F7;   Cascade(ct)                 //cascade
  169.         case Cmd==K_F8;      ct:Drag()                   //move-size
  170.         case Cmd==K_SH_F10;  ct:=Menu(ct)                //local-window-menu
  171.       endcase
  172.       Cmd:=0  //clear task command
  173.     until LastKey()==nSwapTask
  174.   endif
  175.   return(true)
  176.  
  177.  
  178. //-----------------------------------------------------------------------------
  179. // Task::Top() --> newTask
  180. // make this task as active.
  181. //
  182. static function Top(Task)
  183.   local i:=Cmd-K_ALT_1+1
  184.   i:=AScan(TList,{|e|e:ID==i})
  185.   if i>0
  186.     Task:=TList[i]
  187.     if Empty(LastTask) or Task:ID<>LastTask:ID; Task:Top(false); endif  //paint!
  188.   endif
  189.   set lastkey K_ENTER
  190.   return(Task)
  191.  
  192.  
  193. //-----------------------------------------------------------------------------
  194. // Task::List() --> newTask
  195. // list-menu of all active tasks.
  196. //
  197. static function List(Task)
  198.   local Mnu
  199.   local Choice
  200.   local Items:={}
  201.   local uLen
  202.   AEval(TList,{|e|AAdd(Items,"(~"+NTrim(e:ID)+") "+e:Name)})
  203.   uLen:=Max(AWidth(Items)+1,Len(ResTxt(022))+6)
  204.   IEval(Min(Len(Items),9),{|i|Items[i]:=PadR(Items[i],uLen)+"Alt-"+NTrim(TList[i]:ID)})
  205.   object Mnu of Mnu; Mnu:Init(ResTxt(022),-3,-3,,Items)
  206.   SaveDOut(ResTxt(140))
  207.   Choice:=Mnu:Process()
  208.   RestDOut()
  209.   Mnu:Done()
  210.   if Choice>0
  211.     Task:=TList[Choice]
  212.     if Empty(LastTask) or Task:ID<>LastTask:ID; Task:Top(false); endif //paint!
  213.   endif
  214.   set lastkey K_ENTER
  215.   return(Task)
  216.  
  217.  
  218. //-----------------------------------------------------------------------------
  219. // Task::Done() --> nil
  220. // static method: done task, if is possible.
  221. //
  222. static function Done(Task)
  223.   local i:=AScan(TList,{|e|e:ID==Task:ID})
  224.   local lExit:=Task:Done()       //do not automatic repaint windows!
  225.   set lastkey K_ENTER            //assume: not exit
  226.   if lExit
  227.     set lastkey nSwapTask        //force exit from this task
  228.     if i>Len(TList); i--; endif
  229.     if Empty(TList)
  230.       LastTask:={}               //clear LastTask info!
  231.     else
  232.       set lastkey K_ENTER        //not exit
  233.       Task:=ATail(GetWList())
  234.       Task:Top(true)             //repaint window!
  235.     endif
  236.   endif
  237.   return(Task)
  238.  
  239.  
  240. //-----------------------------------------------------------------------------
  241. // Task::ZoomIn() --> true
  242. // zoom-minimize active task window.
  243. //
  244. static function ZoomIn(Task)
  245.   if Task:IsMin
  246.     Task:Restore()
  247.   else
  248.     Task:Minimize()
  249.   endif
  250.   set lastkey K_ENTER
  251.   return(true)
  252.  
  253.  
  254. //-----------------------------------------------------------------------------
  255. // Task::ZoomOut() --> true
  256. // zoom-maximize active task window.
  257. //
  258. static function ZoomOut(Task)
  259.   if Task:IsMax
  260.     Task:Restore()
  261.   else
  262.     Task:Maximize()
  263.   endif
  264.   set lastkey K_ENTER
  265.   return(true)
  266.  
  267.  
  268. //-----------------------------------------------------------------------------
  269. // Task::Switch(lForward) --> true
  270. // switch to next task.
  271. //
  272. static function Switch(Task,lForward)
  273.   local TLen:=Len(TList)
  274.   local i:=AScan(TList,{|e|e:ID==Task:ID})+if(lForward, +1, -1)
  275.   if i<1; i:=TLen; endif
  276.   if i>TLen; i:=1; endif
  277.   if i<=TLen
  278.     Task:=TList[i]
  279.     if Empty(LastTask) or Task:ID<>LastTask:ID; Task:Top(false); endif //Paint!
  280.   endif
  281.   set lastkey K_ENTER
  282.   return(Task)
  283.  
  284.  
  285. //-----------------------------------------------------------------------------
  286. // Task::Cascade() --> nil
  287. // cascade repaint all tasks.
  288. //
  289. static function Cascade(Task)
  290.   local i
  291.   local R:=1
  292.   local C:=0
  293.   local Rs:=MaxRow()-Len(TList)-3
  294.   local Cs:=MaxCol()-Len(TList)
  295.   AEval(TList,{|e|if(e:IsMin,(Rs++,Cs++),nil)})
  296.   AEval(TList,{|e|if(!e:IsMin,(SetCoords(e,R,C,Rs,Cs),R++,C++),nil)})
  297.   Task:RePaint(true)
  298.   set lastkey K_ENTER
  299.   return(true)
  300.  
  301. static function SetCoords(Task,R,C,Rs,Cs)
  302.   Task:Row:=R
  303.   Task:Col:=C
  304.   Task:WRow:=R
  305.   Task:WCol:=C
  306.   Task:RowSize:=Max(Min(Rs,Task:MaxRows),Task:MinRows)
  307.   Task:ColSize:=Max(Min(Cs,Task:MaxCols),Task:MinCols)
  308.   if Task:Row+Task:RowSize+1>=MaxRow(); Task:Row:=MaxRow()-Task:RowSize-2; endif
  309.   if Task:Col+Task:ColSize>=MaxCol(); Task:Col:=MaxCol()-Task:ColSize-1; endif
  310.   Task:WRowSize:=Task:RowSize
  311.   Task:WColSize:=Task:ColSize
  312.   Task:IsMax:=false
  313.   return(true)
  314.  
  315.  
  316. //-----------------------------------------------------------------------------
  317. // Task::Tile() --> true
  318. // tile repaint all tasks.
  319. //
  320. static function Tile(Task)
  321.   local R,C,Rs,Cs
  322.   local i,j:=0,Ntw:=0
  323.   AEval(TList,{|e|if(!e:IsMin,Ntw++,nil)})   //Ntw=NumberTiledWindows
  324.   if Ntw==0; return(true); endif
  325.   R:=1
  326.   C:=0
  327.   do case
  328.     case Ntw==1; Rs:=MaxRow()-4;          Cs:=MaxCol()-1             //1
  329.     case Ntw==2; Rs:=Int((MaxRow()-6)/2); Cs:=MaxCol()-1             //2
  330.     case Ntw==3; Rs:=Int((MaxRow()-6)/2); Cs:=Int((MaxCol()-1)/2)-1  //3
  331.     case Ntw==4; Rs:=Int((MaxRow()-6)/2); Cs:=Int((MaxCol()-1)/2)-1  //4
  332.     case Ntw<=6; Rs:=Int((MaxRow()-6)/2); Cs:=Int((MaxCol()-1)/3)-2  //5,6
  333.     otherwise;   Rs:=Int((MaxRow()-8)/3); Cs:=Int((MaxCol()-1)/3)-2  //7..9, next window will be minimized.
  334.   endcase
  335.   if Len(TList)==1
  336.     TList[1]:Maximize()
  337.   else
  338.     for i:=1 to Len(TList)
  339.       if ! TList[i]:IsMin
  340.         j++ //next worked window
  341.         if 1<j and j<10
  342.           do case
  343.             case Ntw==2
  344.               R+=Rs+2; Rs+=if(MaxRow()>=39,1,0)
  345.             case Ntw==3
  346.               do case
  347.                 case j==2; C+=Cs+2
  348.                 case j==3; R+=Rs+2; Rs+=if(MaxRow()>=39,1,0); C:=0; Cs:=MaxCol()-1
  349.               endcase
  350.             case Ntw==4
  351.               do case
  352.                 case j==2; C+=Cs+2
  353.                 case j==3; R+=Rs+2; C:=0; Rs+=if(MaxRow()>=39,1,0)
  354.                 case j==4; C+=Cs+2
  355.               endcase
  356.             case Ntw<=6
  357.               do case
  358.                 case j<=3; C+=Cs+2; Cs+=if(j==3,2,0)
  359.                 case j==4; R+=Rs+2; C:=0; Cs-=2; Cs:=if(Ntw==5,Int((MaxCol()-1)/2)-1,Cs); Rs+=if(MaxRow()>=39,1,0)
  360.                 otherwise; C+=Cs+2; Cs+=if(j==6,2,0)
  361.               endcase
  362.             case Ntw==7
  363.               do case
  364.                 case j<=3; C+=Cs+2; Cs+=if(j==3,2,0)
  365.                 case j==4 or j==6; R+=Rs+2; C:=0; Cs:=Int((MaxCol()-1)/2)-1; Rs+=if(j==6,1,0); Rs+=if(j==6 and MaxRow()>=49,1,0)
  366.                 otherwise; C+=Cs+2
  367.               endcase
  368.             otherwise  //8,9
  369.               do case
  370.                 case j<=3; C+=Cs+2; Cs+=if(j==3,2,0)
  371.                 case j==4; R+=Rs+2; C:=0; Cs-=2
  372.                 case j==7; R+=Rs+2; C:=0; Cs-=2; Rs++; Cs:=if(Ntw==8,Int((MaxCol()-1)/2)-1,Cs); Rs+=if(MaxRow()>=49,1,0)
  373.                 case j<=6; C+=Cs+2; Cs+=if(j==6,2,0)
  374.                 case j==9; C+=Cs+2; Cs+=2
  375.                 otherwise; C+=Cs+2
  376.               endcase
  377.           endcase
  378.         endif
  379.         if j<10
  380.           SetCoords(TList[i],R,C,Rs,Cs)
  381.         else
  382.           TList[i]:Minimize(false)
  383.         endif
  384.       endif
  385.     endfor
  386.   endif
  387.   Task:RePaint(true)       //repaint!
  388.   set lastkey K_ENTER
  389.   return(true)
  390.  
  391.  
  392. //-----------------------------------------------------------------------------
  393. // Task::Menu() --> newTask
  394. // local task menu.
  395. //
  396. static function Menu(Task)
  397.   local Mnu,SelItems,Choice
  398.   SelItems:=Array(10)
  399.   AFill(SelItems,true)
  400.   do case
  401.     case Task:IsMax;  SelItems[3]:=false
  402.     case Task:IsMin;  SelItems[2]:=false
  403.     otherwise;        SelItems[1]:=false
  404.   endcase
  405.   if Len(TList)==1
  406.     SelItems[4]:=false    //next window
  407.     SelItems[5]:=false    //previous w..
  408.     SelItems[6]:=false    //tile
  409.     SelItems[7]:=false    //cascade
  410.     SelItems[10]:=false   //switch to..
  411.   endif
  412.   object Mnu of Mnu; Mnu:Init(,Task:Row,Task:Col+2,0,ResTxt(129),SelItems)
  413.   SaveDOut(ResTxt(140))
  414.   Choice:=Mnu:Process()
  415.   RestDOut()
  416.   Mnu:Done()
  417.   set lastkey K_ENTER
  418.   do case
  419.     case Choice==1;  Task:Restore()
  420.     case Choice==2;  Task:Minimize()
  421.     case Choice==3;  Task:Maximize()
  422.     case Choice==4;  Task:=Switch(Task,true)
  423.     case Choice==5;  Task:=Switch(Task,false)
  424.     case Choice==6;  Tile(Task)
  425.     case Choice==7;  Cascade(Task)
  426.     case Choice==8;  Task:Drag()
  427.     case Choice==9;  Task:=Done(Task)     //can change LastKey()
  428.     case Choice==10; Task:=List(Task)
  429.   endcase
  430.   return(Task)
  431.  
  432.  
  433. //*****************************************************************************
  434. // Task:Done(lRePaint) --> nil
  435. // done task.
  436. //
  437. method function TaskDone(lRePaint)
  438.   local i:=::ID
  439.   returnif !Eval(::DoneBlock,self) with false
  440.   returnif !::super(Window):Done(lRePaint) with false
  441.   ::IsDead:=true
  442.   LastTask:=if(Empty(TList), {}, ATail(GetWList()))
  443.   if ::UpFlag; return(true); endif            //done for keeping task
  444.   ATrueDel(TList,AScan(TList,{|e|e:ID==i}))
  445.   if i<=9; SetKey(K_ALT_1+i-1,nil); endif
  446.   if Empty(TList)
  447.     SetKey(K_ALT_0, nil)   //task-list
  448.     SetKey(K_F5,    nil)   //zoom-in
  449.     SetKey(K_SH_F5, nil)   //zoom-out
  450.     SetKey(K_F6,    nil)   //switch-forward
  451.     SetKey(K_SH_F6, nil)   //switch-backward
  452.     SetKey(K_F7,    nil)   //tile
  453.     SetKey(K_SH_F7, nil)   //cascade
  454.     SetKey(K_F8,    nil)   //drag
  455.     SetKey(K_SH_F10,nil)   //local-window-menu
  456.     ::RePaint(true)
  457.   endif
  458.   return(true)
  459.  
  460. //------------------------------------------------------- eof (c)JHK ----------
  461.  
  462.